{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "655b8f55-2089-4733-8b09-35dea9580695",
   "metadata": {},
   "source": [
    "# Google Vertex AI Vector Search\n",
    "\n",
    "This notebook shows how to use functionality related to the `Google Cloud Vertex AI Vector Search` vector database.\n",
    "\n",
    "> [Google Vertex AI Vector Search](https://cloud.google.com/vertex-ai/docs/vector-search/overview), formerly known as Vertex AI Matching Engine, provides the industry's leading high-scale low latency vector database. These vector databases are commonly referred to as vector similarity-matching or an approximate nearest neighbor (ANN) service.\n",
    "\n",
    "**Note**: Langchain API expects an endpoint and deployed index already created.Index creation time can take upto one hour.\n",
    "\n",
    "> To see how to create an index refer to the section [Create Index and deploy it to an Endpoint](#create-index-and-deploy-it-to-an-endpoint)  \n",
    "If you already have an index deployed , skip to [Create VectorStore from texts](#create-vector-store-from-texts)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aca99382",
   "metadata": {},
   "source": [
    "## Create Index and deploy it to an Endpoint\n",
    "- This section demonstrates creating a new index and deploying it to an endpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "35b5f3c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO : Set values as per your requirements\n",
    "# Project and Storage Constants\n",
    "PROJECT_ID = \"<my_project_id>\"\n",
    "REGION = \"<my_region>\"\n",
    "BUCKET = \"<my_gcs_bucket>\"\n",
    "BUCKET_URI = f\"gs://{BUCKET}\"\n",
    "\n",
    "# The number of dimensions for the textembedding-gecko@003 is 768\n",
    "# If other embedder is used, the dimensions would probably need to change.\n",
    "DIMENSIONS = 768\n",
    "\n",
    "# Index Constants\n",
    "DISPLAY_NAME = \"<my_matching_engine_index_id>\"\n",
    "DEPLOYED_INDEX_ID = \"<my_matching_engine_endpoint_id>\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ce74ea7e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a bucket.\n",
    "! gsutil mb -l $REGION -p $PROJECT_ID $BUCKET_URI"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28d93078",
   "metadata": {},
   "source": [
    "### Use [VertexAIEmbeddings](https://python.langchain.com/docs/integrations/text_embedding/google_vertex_ai_palm/) as the embeddings model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dfa92a08",
   "metadata": {},
   "outputs": [],
   "source": [
    "from google.cloud import aiplatform\n",
    "from langchain_google_vertexai import VertexAIEmbeddings"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58e5c762",
   "metadata": {},
   "outputs": [],
   "source": [
    "aiplatform.init(project=PROJECT_ID, location=REGION, staging_bucket=BUCKET_URI)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c795913e",
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_model = VertexAIEmbeddings(model_name=\"textembedding-gecko@003\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "73c2e7b5",
   "metadata": {},
   "source": [
    "### Create an empty Index "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b347e21",
   "metadata": {},
   "source": [
    "**Note :** While creating an index you should specify an \"index_update_method\" from either a \"BATCH_UPDATE\" or \"STREAM_UPDATE\"\n",
    "> A batch index is for when you want to update your index in a batch, with data which has been stored over a set amount of time, like systems which are processed weekly or monthly. A streaming index is when you want index data to be updated as new data is added to your datastore, for instance, if you have a bookstore and want to show new inventory online as soon as possible. Which type you choose is important, since setup and requirements are different.\n",
    "\n",
    "Refer [Official Documentation](https://cloud.google.com/vertex-ai/docs/vector-search/create-manage-index#create-index-batch) for more details on configuring indexes\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "37fdc7f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# NOTE : This operation can take upto 30 seconds\n",
    "my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(\n",
    "    display_name=DISPLAY_NAME,\n",
    "    dimensions=DIMENSIONS,\n",
    "    approximate_neighbors_count=150,\n",
    "    distance_measure_type=\"DOT_PRODUCT_DISTANCE\",\n",
    "    index_update_method=\"STREAM_UPDATE\",  # allowed values BATCH_UPDATE , STREAM_UPDATE\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1723d40a",
   "metadata": {},
   "source": [
    "### Create an Endpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f4059888",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create an endpoint\n",
    "my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(\n",
    "    display_name=f\"{DISPLAY_NAME}-endpoint\", public_endpoint_enabled=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43a85682",
   "metadata": {},
   "source": [
    "### Deploy Index to the Endpoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a6582ec1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# NOTE : This operation can take upto 20 minutes\n",
    "my_index_endpoint = my_index_endpoint.deploy_index(\n",
    "    index=my_index, deployed_index_id=DEPLOYED_INDEX_ID\n",
    ")\n",
    "\n",
    "my_index_endpoint.deployed_indexes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9971578-0ae9-4809-9e80-e5f9d3dcc98a",
   "metadata": {},
   "source": [
    "## Create Vector Store from texts"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d98d379",
   "metadata": {},
   "source": [
    "NOTE : If you have existing Index and Endpoints, you can load them using below code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "066c0f63",
   "metadata": {},
   "outputs": [],
   "source": [
    "# TODO : replace 1234567890123456789 with your acutial index ID\n",
    "my_index = aiplatform.MatchingEngineIndex(\"1234567890123456789\")\n",
    "\n",
    "# TODO : replace 1234567890123456789 with your acutial endpoint ID\n",
    "my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint(\"1234567890123456789\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7c96da4-8d97-4f69-8c13-d2fcafc03b05",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_google_vertexai import (\n",
    "    VectorSearchVectorStore,\n",
    "    VectorSearchVectorStoreDatastore,\n",
    ")"
   ]
  },
  {
   "attachments": {
    "Langchainassets.png": {
     "image/png": "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zE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aQ0baCKiOOQvAMxPIpKT/PlpDRtoIqI45C8AzE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aQ0baCKiOOQvAMxPIpKT/PlpDRtoIqI45C8AzE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aQ0baCKiOOQvAMxPIpKT/PlpDRtoIqI45C8AzE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aQ0baCKiOOQvAMxPIpKT/PlpDRtoIqI45C8AzE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aQ0baCKiOOQvAMxPIpKT/PlpDRtoIqI45C8AzE8ikpP8+WkNG2giojjkLwDMTyKSk/z5aY1EDXQoFIr+qxMRScDv90cHlmSYn0QkJ/nz0xqJGmhNP4iiEhFJBu1pdFrJh/lJRBJaEvlpgVwNNBERERGR5NhAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQLYQBMRERERJYANNBERERFRAthAExERERElgA00EREREVEC2EATERERESWADTQRERERUQL+H6R9hp3YdUwHAAAAAElFTkSuQmCC"
    }
   },
   "cell_type": "markdown",
   "id": "b25a61eb",
   "metadata": {},
   "source": [
    "![Langchainassets.png](attachment:Langchainassets.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97ac49ae",
   "metadata": {},
   "source": [
    "### Create simple vectorstore ( without filters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58b70880-edd9-46f3-b769-f26c2bcc8395",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Input texts\n",
    "texts = [\n",
    "    \"The cat sat on\",\n",
    "    \"the mat.\",\n",
    "    \"I like to\",\n",
    "    \"eat pizza for\",\n",
    "    \"dinner.\",\n",
    "    \"The sun sets\",\n",
    "    \"in the west.\",\n",
    "]\n",
    "\n",
    "# Create a Vector Store\n",
    "vector_store = VectorSearchVectorStore.from_components(\n",
    "    project_id=PROJECT_ID,\n",
    "    region=REGION,\n",
    "    gcs_bucket_name=BUCKET,\n",
    "    index_id=my_index.name,\n",
    "    endpoint_id=my_index_endpoint.name,\n",
    "    embedding=embedding_model,\n",
    "    stream_update=True,\n",
    ")\n",
    "\n",
    "# Add vectors and mapped text chunks to your vectore store\n",
    "vector_store.add_texts(texts=texts)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "080cbbdc",
   "metadata": {},
   "source": [
    "### OPTIONAL : You can also create vectore and store chunks in a Datastore "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "97ef5dfd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# NOTE : This operation can take upto 20 mins\n",
    "vector_store = VectorSearchVectorStoreDatastore.from_components(\n",
    "    project_id=PROJECT_ID,\n",
    "    region=REGION,\n",
    "    index_id=my_index.name,\n",
    "    endpoint_id=my_index_endpoint.name,\n",
    "    embedding=embedding_model,\n",
    "    stream_update=True,\n",
    ")\n",
    "\n",
    "vector_store.add_texts(texts=texts, is_complete_overwrite=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b7c65716",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a simialarity search\n",
    "vector_store.similarity_search(\"pizza\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "65d92635",
   "metadata": {},
   "source": [
    "### Create vectorstore with metadata filters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "986951f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Input text with metadata\n",
    "record_data = [\n",
    "    {\n",
    "        \"description\": \"A versatile pair of dark-wash denim jeans.\"\n",
    "        \"Made from durable cotton with a classic straight-leg cut, these jeans\"\n",
    "        \" transition easily from casual days to dressier occasions.\",\n",
    "        \"price\": 65.00,\n",
    "        \"color\": \"blue\",\n",
    "        \"season\": [\"fall\", \"winter\", \"spring\"],\n",
    "    },\n",
    "    {\n",
    "        \"description\": \"A lightweight linen button-down shirt in a crisp white.\"\n",
    "        \" Perfect for keeping cool with breathable fabric and a relaxed fit.\",\n",
    "        \"price\": 34.99,\n",
    "        \"color\": \"white\",\n",
    "        \"season\": [\"summer\", \"spring\"],\n",
    "    },\n",
    "    {\n",
    "        \"description\": \"A soft, chunky knit sweater in a vibrant forest green. \"\n",
    "        \"The oversized fit and cozy wool blend make this ideal for staying warm \"\n",
    "        \"when the temperature drops.\",\n",
    "        \"price\": 89.99,\n",
    "        \"color\": \"green\",\n",
    "        \"season\": [\"fall\", \"winter\"],\n",
    "    },\n",
    "    {\n",
    "        \"description\": \"A classic crewneck t-shirt in a soft, heathered blue. \"\n",
    "        \"Made from comfortable cotton jersey, this t-shirt is a wardrobe essential \"\n",
    "        \"that works for every season.\",\n",
    "        \"price\": 19.99,\n",
    "        \"color\": \"blue\",\n",
    "        \"season\": [\"fall\", \"winter\", \"summer\", \"spring\"],\n",
    "    },\n",
    "    {\n",
    "        \"description\": \"A flowing midi-skirt in a delicate floral print. \"\n",
    "        \"Lightweight and airy, this skirt adds a touch of feminine style \"\n",
    "        \"to warmer days.\",\n",
    "        \"price\": 45.00,\n",
    "        \"color\": \"white\",\n",
    "        \"season\": [\"spring\", \"summer\"],\n",
    "    },\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6cd5fba1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Parse and prepare input data\n",
    "\n",
    "texts = []\n",
    "metadatas = []\n",
    "for record in record_data:\n",
    "    record = record.copy()\n",
    "    page_content = record.pop(\"description\")\n",
    "    texts.append(page_content)\n",
    "    if isinstance(page_content, str):\n",
    "        metadata = {**record}\n",
    "        metadatas.append(metadata)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fc6f0e08",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inspect metadatas\n",
    "metadatas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eb993e1a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# NOTE : This operation can take more than 20 mins\n",
    "vector_store = VectorSearchVectorStore.from_components(\n",
    "    project_id=PROJECT_ID,\n",
    "    region=REGION,\n",
    "    gcs_bucket_name=BUCKET,\n",
    "    index_id=my_index.name,\n",
    "    endpoint_id=my_index_endpoint.name,\n",
    "    embedding=embedding_model,\n",
    ")\n",
    "\n",
    "vector_store.add_texts(texts=texts, metadatas=metadatas, is_complete_overwrite=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dac171b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from google.cloud.aiplatform.matching_engine.matching_engine_index_endpoint import (\n",
    "    Namespace,\n",
    "    NumericNamespace,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03ed6710",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a simple similarity search\n",
    "\n",
    "# Below code should return 5 results\n",
    "vector_store.similarity_search(\"shirt\", k=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d084f0e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a similarity search with text filter\n",
    "filters = [Namespace(name=\"season\", allow_tokens=[\"spring\"])]\n",
    "\n",
    "# Below code should return 4 results now\n",
    "vector_store.similarity_search(\"shirt\", k=5, filter=filters)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3eb3206e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a similarity search with combination of text and numeric filter\n",
    "filters = [Namespace(name=\"season\", allow_tokens=[\"spring\"])]\n",
    "numeric_filters = [NumericNamespace(name=\"price\", value_float=40.0, op=\"LESS\")]\n",
    "\n",
    "# Below code should return 2 results now\n",
    "vector_store.similarity_search(\n",
    "    \"shirt\", k=5, filter=filters, numeric_filter=numeric_filters\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4de820b3",
   "metadata": {},
   "source": [
    "### Use Vector Store as retriever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0ebe598e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialize the vectore_store as retriever\n",
    "retriever = vector_store.as_retriever()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "98a251b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# perform simple similarity search on retriever\n",
    "retriever.invoke(\"What are my options in breathable fabric?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "61ab5631",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a similarity search with text filter\n",
    "filters = [Namespace(name=\"season\", allow_tokens=[\"spring\"])]\n",
    "\n",
    "retriever.search_kwargs = {\"filter\": filters}\n",
    "\n",
    "# perform similarity search with filters on retriever\n",
    "retriever.invoke(\"What are my options in breathable fabric?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5bfcec72",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try running a similarity search with combination of text and numeric filter\n",
    "filters = [Namespace(name=\"season\", allow_tokens=[\"spring\"])]\n",
    "numeric_filters = [NumericNamespace(name=\"price\", value_float=40.0, op=\"LESS\")]\n",
    "\n",
    "\n",
    "retriever.search_kwargs = {\"filter\": filters, \"numeric_filter\": numeric_filters}\n",
    "\n",
    "retriever.invoke(\"What are my options in breathable fabric?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2def7692",
   "metadata": {},
   "source": [
    "### Use filters with retriever in Question Answering Chains"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0f6e31c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_google_vertexai import VertexAI\n",
    "\n",
    "llm = VertexAI(model_name=\"gemini-pro\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6e9054c1",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA\n",
    "\n",
    "filters = [Namespace(name=\"season\", allow_tokens=[\"spring\"])]\n",
    "numeric_filters = [NumericNamespace(name=\"price\", value_float=40.0, op=\"LESS\")]\n",
    "\n",
    "retriever.search_kwargs = {\"k\": 2, \"filter\": filters, \"numeric_filter\": numeric_filters}\n",
    "\n",
    "retrieval_qa = RetrievalQA.from_chain_type(\n",
    "    llm=llm,\n",
    "    chain_type=\"stuff\",\n",
    "    retriever=retriever,\n",
    "    return_source_documents=True,\n",
    ")\n",
    "\n",
    "question = \"What are my options in breathable fabric?\"\n",
    "response = retrieval_qa({\"query\": question})\n",
    "print(f\"{response['result']}\")\n",
    "print(\"REFERENCES\")\n",
    "print(f\"{response['source_documents']}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e987ddef",
   "metadata": {},
   "source": [
    "## Read , Chunk , Vectorise and Index PDFs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "77675a97",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install pypdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aad1896b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PyPDFLoader\n",
    "from langchain_text_splitters import RecursiveCharacterTextSplitter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0454681b",
   "metadata": {},
   "outputs": [],
   "source": [
    "loader = PyPDFLoader(\"https://arxiv.org/pdf/1706.03762.pdf\")\n",
    "pages = loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "159e5722",
   "metadata": {},
   "outputs": [],
   "source": [
    "text_splitter = RecursiveCharacterTextSplitter(\n",
    "    # Set a really small chunk size, just to show.\n",
    "    chunk_size=1000,\n",
    "    chunk_overlap=20,\n",
    "    length_function=len,\n",
    "    is_separator_regex=False,\n",
    ")\n",
    "doc_splits = text_splitter.split_documents(pages)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5a598ec8",
   "metadata": {},
   "outputs": [],
   "source": [
    "texts = [doc.page_content for doc in doc_splits]\n",
    "metadatas = [doc.metadata for doc in doc_splits]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4dc880d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "texts[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "558f9495",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Inspect Metadata of 1st page\n",
    "metadatas[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "81143e4b",
   "metadata": {},
   "outputs": [],
   "source": [
    "vector_store = VectorSearchVectorStore.from_components(\n",
    "    project_id=PROJECT_ID,\n",
    "    region=REGION,\n",
    "    gcs_bucket_name=BUCKET,\n",
    "    index_id=my_index.name,\n",
    "    endpoint_id=my_index_endpoint.name,\n",
    "    embedding=embedding_model,\n",
    ")\n",
    "\n",
    "vector_store.add_texts(texts=texts, metadatas=metadatas, is_complete_overwrite=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7557d531",
   "metadata": {},
   "outputs": [],
   "source": [
    "vector_store = VectorSearchVectorStore.from_components(\n",
    "    project_id=PROJECT_ID,\n",
    "    region=REGION,\n",
    "    gcs_bucket_name=BUCKET,\n",
    "    index_id=my_index.name,\n",
    "    endpoint_id=my_index_endpoint.name,\n",
    "    embedding=embedding_model,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31222b03",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "environment": {
   "kernel": "python3",
   "name": "common-cpu.m107",
   "type": "gcloud",
   "uri": "gcr.io/deeplearning-platform-release/base-cpu:m107"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
